/**
 * @param {number[]} nums
 * @return {number}
 */
// 缺少的正整数的范围必然在[1, n + 1]之内
// n为数组长度
// 原地hash：对于小于等于0的赋值为n+1，因为它们没地方映射。过后所有元素都大于0
// 然后将nums[i]映射到对应位置，但是不能修改这个地方的值，所以将当前元素变为负数，取绝对值就行
var firstMissingPositive = function (nums) {
  let len = nums.length
  for(let i = 0; i < len; i++) {
    if(nums[i] <= 0)
      nums[i] = len + 1
  }
  for(let i = 0; i < len; i++) {
    let num = Math.abs(nums[i])
    if(num <= len) {
      nums[num - 1] = -Math.abs(nums[num - 1])
    }
  }
  for(let i = 0; i < len; i++) {
    if(nums[i] < 0) return i + 1
  }
  return len + 1
};